.TITLE DRSWS .IDENT /02.01/ ; ; Copyright (c) 1995 by Mentec, Inc., U.S.A. ; All rights reserved ; ; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY ONLY BE USED ; OR COPIED ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; J. M. LAWLER 03-DEC-82 ; ; THIS MODULE WAS ORIGINALLY WRITTEN FOR P/OS BY M.C. OZUR ON 21-DEC-81 ; ; MODIFIED BY: ; ; D. Carroll 18-Oct-1995 02.01 ; DC404 - Include PSECT statement to allow ICB pool to be ; fully expanded during sysgen ; ; ; MACRO LIBRARY CALLS ; .MCALL HWDDF$,TCBDF$ HWDDF$ ;DEFINE HARDWARE REGISTERS TCBDF$ ;DEFINE TCB OFFSETS .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404 ;+ ; **-$DRSWS-SWITCH STATE ; ; THIS DIRECTIVE ALLOWS A PRIVILEGED TASK WHICH IS NOT MAPPED TO THE ; EXECUTIVE TO EXECUTE A SUBROUTINE IN SYSTEM STATE. THE USER IS ; CALLED BACK ON THE SYSTEM STACK WITH ALL REGISTERS PRESERVED. ; TO RETURN TO TASK LEVEL THE CALLER MERELY EXECUTES A RETURN. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(175.),DPB SIZE(3.). ; WD. 01 -- BASE ADDRESS FOR MAPPING USERS SYSTEM STATE ROUTINE. ; WD. 02 -- VIRTUAL ADDRESS OF USERS SYSTEM STATE ROUTINE. ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF USER BASE ADDRESS IN DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE SPECIFIED ; TASK IS NOT PRIVILEGED. ; DIRECTIVE STATUS OF 'D.RS81' IS RETURNED IF THE VIRTUAL ; ADDRESS OF SYSTEM STATE SUBROUTINE IS NOT WITHIN ; 4KW OF BASE ADDRESS ; ;- .IF DF S$$WST .ENABL LSB $DRSWS::TST (SP)+ ;REMOVE RETURN ADDR TO DRDSP BIT #T3.PRV,T.ST3(R5) ;IS TASK PRIVILEGED ? BEQ 10$ ;IF EQ, NO MTPD$ @#H.DSW ;RETURN SUCCESSFUL DSW MOV (R3)+,R0 ;GET BASE ADDRESS MOV (R3)+,-(SP) ;GET ADDRESS OF SYSTEM STATE ROUTINE BIC #77,R0 ;CLEAR OUT BYTE WITHIN 32WD BLOCK .IF DF U$$DAS CALL $RELUI ;RELOCATE TO APR 6 ADDRESS .IFF ; DF U$$DAS CALL $RELOC ;RELOCATE TO APR 6 ADDRESS .ENDC ; DF U$$DAS SUB #20000,R2 ;RELOCATE TO APR 5 ADDRESS SUB R0,(SP) ;GET DISPLACEMENT FROM BASE TO SYS STATE CODE CMP (SP),#20000 ;TARGET SUBROUTINE WITHIN APR OF BASE ? BHIS 20$ ;IF GE, NO - ILLEGAL COMBINATION ADD R2,(SP) ;MAKE APR 5 ADDRESSES MOV R1,KINAR5 ;SET UP KERNEL INSTRUCTION 5 .IF DF K$$DAS MOV R1,KDSAR5 ;SET UP KERNEL DATA 5 .ENDC ; DF K$$DAS MOV #$STACK-4,R0 ;POINT TO USER'S PC ON KERNEL STACK MOV -(R0),R5 ;RESTORE USER'S R5 MOV -(R0),R4 ; R4 MOV -(R0),R3 ; R3 MOV -(R0),R2 ; R2 MOV -(R0),R1 ; R1 MOV -(R0),R0 ; R0 ; COMPLETE DIRECTIVE PROCESSING FOR TASK. UPDATE USER SP TO ; REMOVE DPB OR ADDRESS OF DPB FROM THE STACK. A SUCCESSFUL ; DSW HAS ALREADY BEEN RETURNED TO THE USER. MFPI SP ;GET USER STACK POINTER ADD $BTRMV,(SP) ;REMOVE BYTES FROM USER STACK MTPI SP ;RESTORE USER STACK POINTER CLR $BTRMV ;ZERO 'BYTES TO REMOVE' IN CASE ;PRIVILEGED TASK ISSUES A TRAP ; THE USER IS CALLED BACK WITH THE SAME STACK FORMAT AS A CALL TO ; $SWSTK. THE STACK WAS ADJUSTED TO REMOVE THE RETURN ; ADDRESS TO THE DIRECTIVE DISPATCHER AND THE +1 DSW. ; ; 20(SP)=PS PUSHED BY TRAP ; 16(SP)=PC PUSHED BY TRAP ; 14(SP)=SAVED R5 ; 12(SP)=SAVED R4 ; 10(SP)=SAVED R3 ; 06(SP)=SAVED R2 ; 04(SP)=SAVED R1 ; 02(SP)=SAVED R0 ; 00(SP)=RETURN ADDRESS TO SYSXT CALLR @(SP)+ ;JUMP TO USER'S SUBROUTINE 10$: DRSTS D.RS16 ;PRIVILEGE VIOLATION 20$: DRSTS D.RS81 ;ILLEGAL MAPPING SPECIFIED .DSABL LSB .ENDC ;DF S$$WST .END